// 该文件是对axios的二次封装
/**
 * 1. 配置基础路径和超时限制
 * 2. 添加进度条nprogess
 * 3. 返回的数据不用从data中拿，响应就是结果
 * 4. 同一解决错误
 */
import axios from 'axios'
// 引入nprogress
import NProgress from 'nprogress'
import {LOGIN_TOKEN, LOGIN_USER} from "@/constent";
import notification from "ant-design-vue/lib/notification";
import router from "@/router";
import store from "@/vuex/store";
import {Message} from "ant-design-vue";

// service 和 axios一样
const service = axios.create({
  // 配置基础路径，所有接口路径的公共路径,不是服务器
  baseURL: '/api',
  // 超时时间，当ajax请求超过这个时间就会报错
  timeout: 60000,
  withCredentials: true // 允许携带cookie
});

// 请求拦截器
/**
 * 一般做添加统一请求头
 */
service.interceptors.request.use(
    config => {
        // 请求成功的回调
        // 进度条开始
        NProgress.start();
        const token = localStorage.getItem(LOGIN_TOKEN);
        // 如果 token 存在
        // 让每个请求携带自定义 token 请根据实际情况自行修改
        if (token) {
            config.headers['Access-Token'] = token
        }
      // ...
      return config;
    }, error => {
        console.log(error)
      // 失败的回调，可不写，没啥用
      return Promise.reject(error);
    });

// 响应拦截器
/**
 * 获得响应后，先做处理，在给前端
 */
service.interceptors.response.use(
    response => {
      // 进度条结束
      NProgress.done();
      const { data } = response;
      // 响应未登录拦截
      if (data.code === 401){
          router.replace("/user/login");
          // 响应登录失效拦截
      }else if (data.code === 2000){
          Message.error("您的登录信息已过期,请重新登陆")
          store.dispatch('errorHandler');
          router.replace("/user/login");
      }
      return data;
    }, error => {
      // 进度条结束
      NProgress.done();
      if (error.response.status == 500){
          router.replace("/500");
      }
      // 统一处理错误，并return失败的promise，后期可以继续处理错误
      notification.error({
          message: '系统提示',
          description: '服务器异常,请联系管理员'
      })
      //return Promise.reject(new Error('发送ajax请求失败'));
      // 也可以中断promise链，不让后期处理
      return new Promise(()=>{})
    });

export default service;

